﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using SuperRyoninRPG.Main;

namespace SuperRyoninRPG.Display
{
	/// <summary>
	/// アニメーションの再生を制御します。
	/// </summary>
	public struct AnimationPlayer
	{
		/// <summary>
		/// 現在再生しているアニメーションを取得します。
		/// </summary>
		public Animation Animation { get; private set; }

		/// <summary>
		/// アニメーション内の現在のフレームのインデックスを
		/// 取得します。
		/// </summary>
		public int FrameIndex
		{
			get { return frameIndex; }
		}
		int frameIndex;

		/// <summary>
		/// 現在のフレームが表示されている経過時間 (秒単位)。
		/// </summary>
		private float time;

		/// <summary>
		/// 各フレームの下部中央にあるテクスチャーの原点を取得します。
		/// </summary>
		public Vector2 Origin
		{
			get { return new Vector2(Animation.FrameWidth / 2.0f, Animation.FrameHeight); }
		}

		/// <summary>
		/// アニメーションの再生を開始または続行します。
		/// </summary>
		public void PlayAnimation(Animation animation)
		{
			// このアニメーションが既に開始されている場合、再度開始しません。
			if (Animation == animation)
				return;

			// 新しいアニメーションを
			// 開始します。
			this.Animation = animation;
			this.frameIndex = 0;
			this.time = 0.0f;
		}

		/// <summary>
		/// 時間の位置を進め、アニメーションの現在のフレームを描画します。
		/// </summary>
		public void Draw(GameTime gameTime, SpriteBatch spriteBatch, Vector2 position, SpriteEffects spriteEffects)
		{
			if (Animation == null)
				throw new NotSupportedException("No animation is currently playing.");

			// 経過時間を処理します。
			time += (float)gameTime.ElapsedGameTime.TotalSeconds;
			while (time > Animation.FrameTime)
			{
				time -= Animation.FrameTime;

				// フレーム インデックスを進めます。必要に応じて、ループまたは
				// クランプします。
				if (Animation.IsLooping)
				{
					frameIndex = (frameIndex + 1) % Animation.FrameCount;
				}
				else
				{
					frameIndex = Math.Min(frameIndex + 1, Animation.FrameCount - 1);
				}
			}

			// 現在のフレームの元の矩形を計算します。
			int x = FrameIndex * Animation.FrameWidth;
			//if (x != 0)
			//{
			//    x += 1;
			//}
			//int x = 64;
			var source = new Rectangle(x, 0, Animation.FrameWidth, Animation.Texture.Height);
			//var source = new Rectangle(65, 0, 62, 64);
			//var origin = new Vector2(16, 64);
			// 現在のフレームを描画します。
			spriteBatch.Draw(Animation.Texture, position, source, Color.White, 0.0f, Origin, 1.0f, spriteEffects, 0.0f);
		}
	}

}
